<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 组合了原型链继承和借用构造函数继承的优点，是一种最常用的继承方式。

        function Parent(name) {
            this.name = name;
            this.colors = ['red', 'blue', 'green'];
        }

        Parent.prototype.sayName = function() {
            console.log(this.name);
        };

        function Child(name, age) {
            Parent.call(this, name); // 借用构造函数继承实例属性
            this.age = age;
        }

        Child.prototype = new Parent(); // 原型链继承父类方法
        Child.prototype.constructor = Child;

        const child1 = new Child('Child1', 10);
        const child2 = new Child('Child2', 20);

        child1.colors.push('black');

        console.log(child1.colors); // 输出 ['red', 'blue', 'green', 'black']
        console.log(child2.colors); // 输出 ['red', 'blue', 'green']

        child1.sayName(); // 输出 'Child1'


        // 特点：
        // 通过借用构造函数继承父类实例属性，并通过原型链继承父类原型方法。
        // 避免了引用属性共享的问题，同时保证方法可以复用。
        
        // 唯一的缺点是父类构造函数会被调用两次。
    </script>
</body>
</html>